package com.atguigu.chaptar7

object $10_MatchObject {
 /*
    样例类语法: case class 类名([var/val] 属性名:属性类型)
        属性名不用val/var修饰的时候,默认就是val
        样例类会自动生成伴生对象,并在伴生对象中提供常用方法:apply,unapply,toString等
        样例类其实就是伴生对象和伴生类的封装
        因为默认提供的unapply方法,可以将样例类对象的属性提取出来,与样例类的属性进行匹配
            unapply方法如果返回容器Some(属性)且与样例类属性一致则匹配成功,若返回None,则匹配失败

        普通类对象默认不能直接用于模式匹配,如果要想用于模式匹配,
        需要在伴生对象中定义unapply方法将对象解构成属性
  */
 def main(args: Array[String]): Unit = {
   //1.因为样例类自动生成伴生对象,所以直接使用apply方法创建样例类对象
   val person = Person("wzx")//person.name = "dd" 属性名不用val/var修饰的时候,默认就是val,属性不可变
   //2.因为伴生对象中有unapply方法,所以样例类对象可以直接进行模式匹配
   person match {
     case Person(a)=>print(s"a=${a}")

   //3.样例类对象与普通对象的对比
       //3.1创建了伴生对象并且提供apply方法后才可apply生成对象
    }}
  val zy = Student("wzx",18)
  //zy.name//3.2只能调用用val修饰了的属性,没用val/var修饰,默认是局部变量,外界无法调用
  zy match {
    case Student(b)=>println(s" b=${b}")//3.3要手动在伴生对象中提供unapply方法才可使用模式匹配,且无法匹配name,因为没有声明val
  }
}
case class Person(name:String){//声明属性不用val/var修饰的时候,默认就是val,该属性无法修改,外界可以调用
  def add(x:Int,y:Int): Int=x+y
}
class Student( name:String,val age:Int)//声明时如果不用val/var修饰,默认是局部变量,外界无法调用
object Student{
  def apply(name: String, age: Int): Student = new Student(name, age)
  def unapply(arg: Student): Option[ Int] = {//手动声明unapply方法,将对象解构成属性
    if(arg == null ) None
    else Some(arg.age)
  }
}